package com.bookmanager.www.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bookmanager.www.common.PO.AdminMenuListPO;
import com.bookmanager.www.entity.EndRole;
import com.bookmanager.www.entity.FlOauth2;
import com.bookmanager.www.entity.FlUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bookmanager.www.entity.LoginDetail;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 用户表 Mapper 接口
 * </p>
 *
 * @author 风离
 * @since 2021-09-17
 */
public interface FlUserMapper extends BaseMapper<FlUser> {

    /**
     * 通过用户id更新头像
     * @param userId
     * @param newAvatar
     * @return
     */
     int updateAvatarByUserId(@Param("userId")String userId,@Param("newAvatar")String newAvatar);

    /**
     * 通过传入的用户名判断是否存在该用户
     * @param username
     * @return
     */
    FlUser selectUserByUsername(@Param("username")String username);

    /**
     * 根据用户名和密码来获取一个用户
     * @param username
     * @param password
     * @return
     */
    FlUser selectUserByUsernameAndPassword(@Param("username")String username,@Param("password")String password);

    /**
     * 根据用户id查找用户
     * @param userId
     * @return
     */
    FlUser selectUserById(@Param("userId")String userId);

    /**
     * 根据用户id查找该用户的角色id
     * @param userId
     * @return
     */
    Integer selectRoleIdByUserId(@Param("userId")String userId);

    /**
     * 根据老用户名修改用户名
     * @param oldUsername
     * @param newUsername
     * @return
     */
    int changeUsernameByOldUsername(@Param("oldUsername")String oldUsername,@Param("newUsername") String newUsername);

    /**
     * 根据用户名修改密码
     * @param username
     * @param password
     * @return
     */
    int changePasswordByUsername(@Param("username")String username,@Param("password")String password);

    /**
     * 根据老密改密码
     * @param oldPassword
     * @param newPassword
     * @return
     */
    int changePasswordByOldPassword(@Param("oldPassword")String oldPassword,@Param("newPassword") String newPassword);

    /**
     * 通过邮箱号来获取用户
     * @param email
     * @return
     */
    FlUser selectUserByEmail(@Param("email")String email);

    /**
     * 通过手机号获取用户
     * @param phoneNum
     * @return
     */
    FlUser selectUserByPhoneNum(@Param("phoneNum")String phoneNum);

    /**
     * 根据邮箱和密码查找用户
     * @param username
     * @param password
     * @return
     */
    FlUser selectUserByEmailAndPassword(@Param("email")String username, @Param("password")String password);

    /**
     * 根据手机号和密码查找用户
     * @param username
     * @param password
     * @return
     */
    FlUser selectUserByPhoneNumAndPassword(@Param("phoneNum")String username,@Param("password") String password);


    /**
     * 修改用户个签
     * @param userId
     * @param desc
     * @return
     */
    int changeUserDesc(@Param("userId")String userId,@Param("desc")String desc);

    /**
     * 修改用户性别
     * @param userId
     * @param sex
     * @return
     */
    int changeUserSex(@Param("userId")String userId,@Param("sex") Integer sex);

    /**
     * 修改用户手机号
     * @param userId
     * @param phoneNum
     * @return
     */
    int changeUserPhoneNum(@Param("userId")String userId, @Param("phoneNum") String phoneNum);

    /**
     * 修改用户邮箱号
     * @param userId
     * @param email
     * @return
     */
    int changeUserEmail(@Param("userId")String userId,@Param("email") String email);

    /**
     * 解绑邮箱
     * @param userId
     * @return
     */
    int unBindEmail(@Param("userId")String userId);

    /**
     * 解绑手机号
     * @param userId
     * @return
     */
    int unBindPhoneNum(@Param("userId")String userId);


    /**
     * 根据用户id改变用户余额
     * @param userId
     * @param newBalance
     * @return
     */
    int changeAccountBalanceByUserId(@Param("userId")String userId,@Param("balance") BigDecimal newBalance);

    /**
     * 根据用户id查询用户余额
     * @param userId
     * @return
     */
    BigDecimal selectAccountBalanceByUserId(@Param("userId")String userId);

    /**
     * 将该用户升级为所选等级
     * @param userId
     * @return
     */
    int upLevel(@Param("userId")String userId,@Param("level")Integer level);


    /**
     * 查询用户会员等级
     * @param userId
     * @return
     */
    int selectAccountLevelByUserId(@Param("userId")String userId);

    /**
     * 添加到累计充值中
     * @param userId
     * @param bigDecimal
     * @return
     */
    int addCumulativeRecharge(@Param("userId")String userId, @Param("cumulative_recharge") BigDecimal bigDecimal);


    /**
     * 给用户充值
     * @param userId
     * @param bigDecimal
     * @return
     */
    int addUserAccountByUserId(@Param("userId")String userId, @Param("account_balance") BigDecimal bigDecimal);

    /**
     * 添加到累计消费中
     * @param userId
     * @param invoice_amount2
     * @return
     */
    int addCumulativeConsumption(@Param("userId")String userId,@Param("invoice_amount2") double invoice_amount2);

    /**
     * 查询累计消费金额
     * @param userId
     * @return
     */
    BigDecimal selectCumulativeConsumption(@Param("userId")String userId);

    /**
     * 根据第三方平台的uuid 和那个第三方平台唯一确定 用户是否绑定该平台
     * @param uuid
     * @param source
     * @return
     */
    String selectUserIdByOAuth2UuidAndType(@Param("uuid") String uuid,@Param("third_type") String source);

    /**
     * 完成第三方平台与用户的双向绑定
     * @param uuid
     * @param uid
     * @param source
     * @param accessToken
     * @return
     */
    int insertOAuth2User(@Param("uuid") String uuid,@Param("user_id") String uid,@Param("third_type") String source,
                         @Param("access_token")String accessToken);

    /**
     * 根据用户id 和用户绑定第三方账号的来源来找第三方的uuid
     * @param userId
     * @param source
     * @return
     */
    String selectUUIDByuserIdAndSource(@Param("user_id")String userId, @Param("third_type") String source);

    /**
     * 个人账号与第三方账号的解绑
     * @param uuid
     * @param source
     * @return
     */
    int deleteUUIDbyUUIDAndSource(@Param("uuid")String uuid,@Param("third_type") String source);

    /**
     * 查询用户绑定的第三方账号
     * @param userId
     * @return
     */
    List<FlOauth2> selectUsersOAuth2(@Param("user_id") String userId);

    /**
     * 根据用户id查找该用户已有的支付密码
     * @param userId
     * @return
     */
    String selectUserPayPasswordByUserId(@Param("user_id")String userId);

    /**
     * 将加密之后的密码存入数据库中
     * @param userId
     * @param encryptPassword
     * @param createTime
     * @return
     */
    int insertUserPayPassword(@Param("user_id") String userId, @Param("password") String encryptPassword,@Param("create_time") LocalDateTime createTime);

    /**
     * 修改用户支付密码的最后一步
     * @param userId
     * @param encryptPassword
     * @return
     */
    int updateUserPayPassword(@Param("user_id")String userId,@Param("password") String encryptPassword);

    /**
     * 插入用户登录信息
     * @param detailId
     * @param userId
     * @param ipDetail
     * @param now
     * @param ip
     * @return
     */
    int insertUserLoginDetail(@Param("detail_id") String detailId,@Param("user_id") String userId,
                              @Param("user_address_detail")String ipDetail,@Param("login_time") LocalDateTime now,
                              @Param("ip")String ip);

    /**
     * 根据DetailId查询登录信息
     * @param detailId
     * @return
     */
    LoginDetail selectLoginDetail(@Param("detail_id")String detailId);

    /**
     * 分页查询用户登录信息
     * @param p
     * @param loginDetail
     * @param userId
     * @return
     */
    List<LoginDetail> selectLoginDetailByUserIdPageExt(Page<LoginDetail> p, LoginDetail loginDetail, @Param("user_id") String userId);



    /**
     * 查询不同角色信息
     * @param p
     * @param flUser
     * @param i
     * @return
     */
    List<FlUser> selectRoleUser(Page<FlUser> p, FlUser flUser, @Param("role_id") int i);

    /**
     * 统计普通用户数量
     * @param roleId
     * @return
     */
    int selectUserCount(@Param("roleId") int roleId);

    /**
     * 查询用户通过创建时间
     * @param lastDayStart
     * @param lastDayEnd
     * @return
     */
    int selectUserByCreateTime(@Param("start") String lastDayStart,@Param("end") String lastDayEnd);

    int selectCountByUserLevelAndRoleId(@Param("level") int level,@Param("role_id")  int roleId);

    /**
     * 删除管理员/普通用户账号
     * @param adminId
     * @return
     */
    int deleteBatchAdmin(@Param("user_id") String adminId);

    /**
     * 批量改变用户状态 禁封或者解封
     * @param user
     * @param status
     * @return
     */
    int changeUserStatusByUserId(@Param("user_id")String user,
                                 @Param("account_status") Integer status);


    /**
     * 获取用户状态 判断用户是否被封号
     * @param userId
     * @return
     */
    int getUserStatus(@Param("user_id")String userId);

    /**
     * 根据UserId获取RoleId
     * @param userId
     * @return
     */
    int getRoleIdByUserId(@Param("userId") String userId);

    /**
     * 获取角色列表
     * @return
     */
    List<EndRole> getEndRolesList();

    /**
     * 获取所有管理员菜单列表
     * @return
     */
    List<AdminMenuListPO> getAdminMenuList();

    /**
     * 更新角色身份
     * @param userId
     * @param roleId
     * @return
     */
    int updateRoleId(@Param("userId") String userId,@Param("roleId") String roleId);

    /**
     * 根据RoleID 获取MenuId
     * @param roleId
     * @return
     */
    List<Integer> getMenuIdList(@Param("roleId")String roleId);
}
